/*
 * ABO.c
 *
 *  Created on: 11/30/2013
 *      Author: enano
 */

#include "ABO.h"

#define VACIO 1
#define ERROR -1
#define ERR_VACIO -2


int ABO_Crear( TABO* abo, int tamDato )
{
    abo->tamanio = tamDato;
    AB_Crear( &(abo->arbol) , tamDato );

    return OK;
}


int ABO_Vacio(const TABO* abo )
{
    return AB_Vacio(abo->arbol);
}


int ABO_Vaciar( TABO *abo )
{
    AB_Vaciar( &(abo->arbol) );
    return OK;
}


int ABO_ElemCte( TABO abo, void* elem )
{
    AB_ElemCte( abo.arbol, elem );
    return OK;
}


int ABO_ModifCte( TABO* abo, void* elem )
{
    AB_ModifCte( &(abo->arbol), elem );
    return OK;
}



int ABO_BorrarRama( TABO *abo )
{
    return AB_BorrarRama( &(abo->arbol) );
}


int ABO_BorrarSubRama( TABO* abo, int mov )
{
    return AB_BorrarSubRama( &(abo->arbol), mov );
}


int ABO_MoverCte( TABO* abo, int mov )
{
    return AB_MoverCte( &(abo->arbol), mov);

}


int insertarOrd( TABO* abo, taboCmp cmp, void* elemIns)
{   void* elemAb;

    elemAb = malloc( abo->tamanio );

    AB_ElemCte( abo->arbol, elemAb );

    if ( cmp(elemAb, elemIns) == D_MAY_I )  //se mueve a la derecha
    {
        if ( AB_MoverCte( &(abo->arbol), DER ) == TRUE )
            insertarOrd( abo, cmp, elemIns );
        else
            AB_Insertar( &(abo->arbol), DER, elemIns );
    }
    else
    {
        if ( cmp(elemAb, elemIns) == I_MAY_D )  //se mueve a la izquierda
        {
            if ( AB_MoverCte( &(abo->arbol), IZQ ) == TRUE )
                insertarOrd( abo, cmp, elemIns );
            else
                AB_Insertar( &(abo->arbol), IZQ, elemIns );

        }
        else    // IGUALES
        {
           free(elemAb);
           return ELEM_EXISTENTE; //no se puede cortar el cargo de datos solo porque ya existe. uno se mete ahi adentro!
        }
    }

    free(elemAb);
    return TRUE;
}

int ABO_InsertarOrdenado( TABO* abo, taboCmp cmp, void* const elem )
{

    if( AB_Vacio(abo->arbol) == TRUE )
    {
        AB_Insertar( &(abo->arbol), RAIZ, elem );
        return TRUE;
    }

    AB_MoverCte( &(abo->arbol), RAIZ);

    return insertarOrd( abo, cmp, elem );

}


int ABO_Buscar( TABO* abo, taboProc func, metodo opcion )
{



    return TRUE;
}
